﻿-------------------------------------------------------------------------------------------------------------------
--------------------------------------pca_parqueos.pagos_abonados--------------------------------------------------
-------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_parqueos.fn_emitir_comprobante_abonado(varchar,--empresa_id $1
								      varchar,--oficina_id $2
								      bigint,--liquidacion_id $3
								      character,--usuario_id $4
								      bigint,--abonado_id $5
								      bigint,--cliente_id $6
								      bigint,--sesion_id $7
								      text,--detalle $8
								      varchar,--medio_pago_id $9
								      varchar,--moneda_id $10
								      numeric,--precio_venta $11
								      numeric --efectivo_percibido $12
								      )RETURNS bigint AS
$$
DECLARE
	_abonado pca_socios.clientes%ROWTYPE;
	_terminal_id pca_parqueos.usuarios_terminales.terminal_id%TYPE;
	_correlativo pca.correlativos%ROWTYPE;
	_comprobante_id pca_ventas.comprobantes.comprobante_id%TYPE;

	--Informacion del cliente
	_cliente pca_socios.clientes%ROWTYPE;
	_num_doc_identidad pca_ventas.comprobantes.num_doc_identidad%TYPE;
	_nombre_cliente pca_ventas.comprobantes.nombre_cliente%TYPE;
	_direccion_cliente pca_ventas.comprobantes.direccion_cliente%TYPE;
	
	--Variables para el comprobante de venta
	_serie pca_ventas.comprobantes.serie%TYPE;
	_numero pca_ventas.comprobantes.numero%TYPE;
	_plazo_id pca_ventas.comprobantes.plazo_id%TYPE;
	_precios_incluyen_igv pca_ventas.comprobantes.precios_incluyen_igv%TYPE;
	_porcentaje_igv pca_ventas.comprobantes.porcentaje_igv%TYPE;
	_importe_bruto pca_ventas.comprobantes.importe_bruto%TYPE;
	_descuento pca_ventas.comprobantes.descuento%TYPE;
	_valor_venta pca_ventas.comprobantes.valor_venta%TYPE;
	_impuesto pca_ventas.comprobantes.impuesto%TYPE;
	_precio_venta pca_ventas.comprobantes.precio_venta%TYPE;
	_serie_impresora varchar;

	--Variables para el detalle del documento de venta
	_descripcion pca_ventas.detalles_comprobante.descripcion%TYPE;
	_precio_unitario pca_ventas.detalles_comprobante.precio_unitario%TYPE;

	--Variable para registrar el pago
	_medio_pago_id pca_ventas.pagos_comprobante.medio_pago_id%TYPE;
	_grupo_movimiento_id pca_caja.movimientos.grupo_movimiento_id%TYPE;
	_subgrupo_movimiento_id pca_caja.movimientos.subgrupo_movimiento_id%TYPE;
BEGIN
	--Consultams informacion del terminal
	SELECT
		terminal_id
	INTO
		_terminal_id
	FROM
		pca_parqueos.usuarios_terminales
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		usuario_id = $4;

	IF NOT FOUND THEN
		RAISE EXCEPTION 'No existe un terminal asignado al usuario';
	END IF;

	--Verificamos que exista correlativo para el tipo de documento
	SELECT
		*
	INTO
		_correlativo
	FROM
		pca.correlativos
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		terminal_id = _terminal_id AND
		tipo_comprobante_id = '12';

	IF NOT FOUND THEN
		RAISE EXCEPTION 'No existe correlativo para emitir tickets';
	END IF;

	--Inicializamos y calculamos las variables para registrar venta
	_serie := _correlativo.serie;
	_numero := _correlativo.numero + 1;
	_plazo_id := '01';--Al contado por defecto
	_precios_incluyen_igv := true;--Todos los precios incluyen IGV por defecto

	SELECT 
		valor::numeric(4,2) 
	INTO
		_porcentaje_igv 
	FROM 
		pca_tablas.fn_get_configuracion('ValIgv');

	IF NOT FOUND THEN
		RAISE EXCEPTION 'Error al consultar el valor del IGV';
	END IF;

	IF($11<=0 )THEN
		RAISE EXCEPTION 'Precio venta no puede ser menor o igual a CERO';
	END IF;
	
	_importe_bruto := $11;
	_descuento := 0;
	_precio_venta := $11;
	_valor_venta := _precio_venta / (1 + _porcentaje_igv/100);
	_impuesto := _precio_venta - _valor_venta;
	_serie_impresora := _correlativo.serie_impresora;

	--Consultamos informacion del abonado
	SELECT
		*
	INTO
		_abonado
	FROM
		pca_socios.clientes
	WHERE
		empresa_id = $1 AND
		cliente_id = $5;

	IF NOT FOUND THEN
		RAISE EXCEPTION 'Error al consultar informacion del abonado';
	END IF;
	
	--Consultamos informacion del cliente
	IF($6 IS NULL OR $6 = 0)THEN
		$6 := $5;
		_num_doc_identidad := '';
		_nombre_cliente := _abonado.nombre;
		_direccion_cliente := '';
	ELSE
		SELECT
			*
		INTO
			_cliente
		FROM
			pca_socios.clientes
		WHERE
			empresa_id = $1 AND
			cliente_id = $6;

		IF NOT FOUND THEN
			RAISE EXCEPTION 'Error al leer datos del cliente';
		END IF;
	
		_num_doc_identidad := _cliente.num_doc_identidad;
		_nombre_cliente := _cliente.nombre_cliente;
		_direccion_cliente := _cliente.direccion_cliente;
	END IF;

	_descripcion := $8;

	_precio_unitario := $11;

	--Valores por defecto para los pagos
	_medio_pago_id := $9;
	_grupo_movimiento_id := 124940686;
	_subgrupo_movimiento_id := NULL;

	--Registramos el encabezado del documento de venta
	_comprobante_id := pca_ventas.fn_add_comprobante($1,--empresa_id
							 $2,--oficina_id
							 '12',--tipo_comprobante_id
							 $7,--sesion_id
							 _serie,--serie
							 _numero,--numero
							 $6,--cliente_id
							 _num_doc_identidad,--num_doc_identidad
							 _nombre_cliente,--nombre_cliente
							 _direccion_cliente,--direccion_cliente
							 _plazo_id,--plazo_id
							 current_timestamp,--fecha_hora_emision
							 current_timestamp,--fecha_hora_vencimiento
							 _precios_incluyen_igv,--precios_incluyen_igv
							 _porcentaje_igv,--porcentaje_igv
							 $10,--moneda_id
							 _importe_bruto,--importe_bruto
							 _descuento,--descuento
							 _valor_venta,--valor_venta
							 _impuesto,--impuesto
							 _precio_venta,--precio_venta
							 0,--tipo_cambio_emision
							 '01',--estado_comprobante_id
							 _serie_impresora,--adicional1
							 '',--adicional2
							 '',--adicional3
							 '' --adicional4
							 );

	--Registramos un detalle para el documento de venta
	PERFORM pca_ventas.fn_add_detalle_comprobante($1,--empresa_id
						      $2,--oficina_id
						      _comprobante_id,--comprobante_id
						      $7,--sesion_id
						      0,--correlativo
						      null,--articulo_id
						      null,--codigo
						      1,--cantidad
						      null,--medida
						      _descripcion,--descripcion
						      _precio_unitario,--precio_unitario
						      0,--precio_costo
						      $11 --precio_total
						      );

	--Registramos un pago para el documento de venta
	PERFORM pca_ventas.fn_add_pago_comprobante($1,--empresa_id
						   $2,--oficina_id
						   _comprobante_id,--comprobante_id
						   _medio_pago_id,--medio_pago_id
						   $12,--efectivo_percibido
						   _grupo_movimiento_id,--grupo_movimiento_id
						   _subgrupo_movimiento_id,--subgrupo_movimiento_id
						   $7,--sesion_id
						   current_date,--fecha
						   $3,--liquidacion_id
						   $4,--usuario_id
						   _descripcion,--detalle
						   $10,--moneda_id
						   $11 --monto
						   );

	--Registramos el pago en la tabla pca_parqueos.pagos_abonados
	INSERT INTO pca_parqueos.pagos_abonados VALUES($1,$2,$5,_comprobante_id,_descripcion);

	--Actualizamos el numero del correlativo
	UPDATE pca.correlativos SET
		numero = numero + 1
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		terminal_id = _terminal_id AND
		tipo_comprobante_id = '12';
		
	RETURN _comprobante_id;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_list_pagos_abonados(integer,--start $1
								   integer,--limit $2
								   varchar,--empresa_id $3
								   varchar,--oficina_id $4
								   bigint,--abonado_id $5
								   varchar --filtro(detalle) $6
								   )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			*
		FROM
			pca_parqueos.vw_pagos_abonados
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			abonado_id = $5 AND
			lower(pca_global.fn_ascii(detalle)) LIKE '%'|| lower(pca_global.fn_ascii($6)) ||'%'
		ORDER BY
			fecha_hora_emision DESC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			*
		FROM
			pca_parqueos.vw_pagos_abonados
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			abonado_id = $5 AND
			lower(pca_global.fn_ascii(detalle)) LIKE '%'|| lower(pca_global.fn_ascii($6)) ||'%';
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;